package com.yby6.web.controller.weChart;

import com.yby6.system.service.WeChatService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import com.yby6.common.core.AjaxResult;
import com.yby6.common.core.redis.RedisCache;
import com.yby6.common.utils.xml.XmlUtil;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * @Author yang shuai
 * @Date 2022/9/3
 * EtlW0obtTRtgzQ03WYMiKWVFb2uZWjwkyzdtrVVUYYs
 */
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/weChat")
public class weChatController {

    private final RedisCache redisCache;
    private final WeChatService weChatService;

    /**
     * 模拟前端
     * 登陆成功跳转
     */
    @GetMapping("/success")
    @ResponseBody
    public String loginSuccess() {
        return "登陆成功";
    }


    /**
     * 用于检测扫码和关注状态
     */
    @PostMapping("/checkLogin")
    @ResponseBody
    public Object checkLogin(String ticket) {
        // 存在该信息并且为关注了公众号
        if (redisCache.hashKey(ticket)) {
            if (redisCache.getCacheObject(ticket).equals("scan")) {
                return AjaxResult.error(201, "扫码成功");
            }
            // 扫码通过则删除
            redisCache.deleteObject(ticket);
            return AjaxResult.success();

        }
        return AjaxResult.error("无动作");
    }

    /**
     * 获取二维码参数
     */
    @GetMapping("/getQrCode")
    @ResponseBody
    public Object getQrCode() {
        return weChatService.getQrCode();
    }


    /***
     * 微信服务器触发get请求用于检测签名
     */
    @GetMapping("/weChatScanCodeCallback")
    @ResponseBody
    public String handleWechatCheckSignature(HttpServletRequest request) {
        //todo 严格来说这里需要做签名验证,我这里为了方便就不做了
        // yby6
        System.out.println(request.getParameterMap());
        return request.getParameter("echostr");
    }

    /**
     * 接收微信推送事件
     * 扫描带参数二维码事件
     * 用户扫描带场景值二维码时，可能推送以下两种事件：
     * 1. 如果用户还未关注公众号，则用户可以关注公众号，关注后微信会将带场景值关注事件推送给开发者。
     * 2. 如果用户已经关注公众号，则微信会将带场景值扫描事件推送给开发者。
     * 3. 自己生成的二维码不管是关注还是扫码都能取到ticket凭证。
     */
    @PostMapping("/weChatScanCodeCallback")
    @ResponseBody
    public String handleWeChatScanCodeCallbackEvent(HttpServletRequest request) {
        try {
            InputStream inputStream = request.getInputStream();
            Map<String, Object> map = XmlUtil.parseXML(inputStream);
            log.info("接收参数:{}", map);
            String userOpenId = (String) map.get("FromUserName");
            // 	事件类型，subscribe(订阅)、unsubscribe(取消订阅)
            String event = (String) map.get("Event");
            String MsgType = (String) map.get("MsgType");
            if ("subscribe".equals(event)) {
                // userOpenId 这个是微信扫码用户的唯一id 进行保存到你自己业务里面的user用户表进行创建登录成功token设置到redis
                // 前端根据段轮询进行访问 checkWechat 进行获取是否成功登录

                // 我这里就假设 subscribe 标识为登录成功
                //自己生成的二维码不管是关注还是扫码都能取到ticket凭证,这里我使用Ticket作为每次二维码的唯一标识
                String ticket = (String) map.get("Ticket");
                redisCache.setCacheObject(ticket, "subscribe", (long) (10 * 60), TimeUnit.SECONDS);

                log.info("用户关注:{}", userOpenId);
            } else if ("SCAN".equals(event)) {
                String ticket = (String) map.get("Ticket");
                redisCache.setCacheObject(ticket, "scan", (long) (10 * 60), TimeUnit.SECONDS);
                log.info("用户扫码:{}", userOpenId);
            } else if ("text".equals(MsgType)) {
                String ToUserName = (String) map.get("ToUserName");
                String FromUserName = (String) map.get("FromUserName");
                String MsgId = (String) map.get("MsgId");
                String Content = (String) map.get("Content");

                Map<String, Object> hashMap = new HashMap<>();
                hashMap.put("ToUserName", ToUserName);
                hashMap.put("FromUserName", ToUserName);
                hashMap.put("CreateTime", new Date());
                hashMap.put("MsgType", "text");
                hashMap.put("Content", "干啥??");

                String s = XmlUtil.buildBodyXml(hashMap);
                log.info("用户公众号发送消息:{}", Content);

                return s;
            } else {



                // 取消关注
                System.out.println("用户取消关注:"+ userOpenId);
                System.out.println(map);

                // 删除数据库当中 关联系统的扫码用户(禁用)
            }

        } catch (IOException e) {
            log.error("登录异常: ", e);
        }
        return "success";
    }

}
